// 引入vnode函数
import vnode from './vnode'

// h函数返回
/**
 * 
 * @param {*} sel 
 * @param {*} data 
 * @param {*} c 
 * 
 * 情况1：h('div', {}, 'text')
 * 情况2：h('div', {}, [])
 * 情况3：h('div', {}, h())
 */
export default function(sel, data, c) {
  // 我们这里默认传入三个参数---低配版
  if (arguments.length !== 3) {
    throw new Error("低配版h函数必须传入三个参数")
  }
  // 判断参数类型
  // 情况1：h('div', {}, 'text')
  if (typeof c === 'string' || typeof c === 'number') {
    return vnode(sel, data, undefined, c, undefined);
  } 
  // 情况2：h('div', {}, [])
  else if (Array.isArray(c)) {
    // 数组里面应该是多个h函数
    let children = [];
    for (let i = 0; i < c.length; i++) {
      if (!(typeof c[i] == 'object' && c[i].hasOwnProperty('sel'))) {
        throw new Error('传入的数组参数中有项不是h函数')
      }
      // 是h函数的就说明是孩子节点，收集起来
      children.push(c[i]);
    }
    return vnode(sel, data, children, undefined, undefined);
  }
  // 情况3：h('div', {}, h()) --即传入的c是唯一孩子
  else if (typeof c === 'object' && c.hasOwnProperty('sel')) {
    let children = [c];
    return vnode(sel, data, children, undefined, undefined);
  } else {
    throw new Error('传入的第三个参数类型不符合条件')
  }

}